#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>
#include <QLineEdit>
#include <QLabel>
#include <QLineEdit>
#include <QTextBrowser>
#include <QJsonObject>
#include <QJsonDocument>

#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QSpacerItem>
#include <QWidget>

#include <QUdpSocket>
#include <QTcpSocket>
#include <QNetworkInterface>

#include <QTime>
#include <QPixmap>
#include <QDebug>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    /* 控件对象 */
    QLabel       *ipLabel;
    QLineEdit    *ipLineEdit;
    QLabel       *portLabel;
    QLineEdit    *portLineEdit;
    QPushButton  *connectBtn;    /* 连接按键 */
    QPushButton  *disconnectBtn; /* 断开连接按键 */
    QPushButton  *captureBtn;    /* 截屏按键 */
    QPushButton  *upendBtn;      /* 倒放按键 */
    QPushButton  *upBtn;         /* 向上按键 */
    QPushButton  *downBtn;       /* 向下按键 */
    QPushButton  *leftBtn;       /* 向左按键 */
    QPushButton  *rightBtn;      /* 向右按键 */
    QLabel       *picLabel;      /* 视频标签 */
    QTextBrowser *textBrowser;   /* 日志窗口 */
    QPushButton  *clearBtn;      /* 清除日志按键 */

    unsigned int appid = 1;
    unsigned int deviceid = 1;

    /* 布局对象 */
    QHBoxLayout *netH0Layout;
    QHBoxLayout *netH1Layout;
    QHBoxLayout *netH2Layout;
    QWidget     *netH0Widget;
    QWidget     *netH1Widget;
    QWidget     *netH2Widget;
    QVBoxLayout *netV0Layout;
    QWidget     *netV0Widget;

    QHBoxLayout *h0Layout;
    QHBoxLayout *h1Layout;
    QHBoxLayout *h2Layout;
    QHBoxLayout *hMainLayout;
    QVBoxLayout *v0Layout;
    QWidget     *h0Widget;
    QWidget     *h1Widget;
    QWidget     *h2Widget;
    QWidget     *hMainWidget;
    QWidget     *v0Widget;

    /* network相关 */
    QTcpSocket  *tcpSocket;
    QUdpSocket  *udpSocket;
    int         udpPort;

    QString     ipString = "111.170.145.74";
    QString     portString = "8100";

    /* 布局函数 */
    void videoMonitorLayout();

    void networkInit();

    /* 输出信息到 textBrowser */
    void printLogOnTextBrowser(const QString &);

signals:
    void readyToRecvUdp();

private slots:
    void toClearTextBrowser();

    void toSaveCapture();
    void toUpendVideo();

    /* 控制云台方向 */
    void toCtrlGimbalUp();
    void toCtrlGimbalDown();
    void toCtrlGimbalLeft();
    void toCtrlGimbalRight();

    /* 网络相关 */
    void toConnectTcpSocket();
    void tcpConnected();   /* 已连接槽函数 */
    void toDisconnectTcpSocket();
    void tcpDisconnect();
    void toSendAnyUdpData();

    /* 网络状态相关 */
    void receivedReplyData();
    void receivedVideoDataAndShow();

    /* 连接状态改变槽函数 */
    void tcpSocketStateChange(QAbstractSocket::SocketState);
    void udpSocketStateChange(QAbstractSocket::SocketState);
};
#endif // MAINWINDOW_H
